home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SNNSV32.ZIP / SNNSv3.2 / kernel / sources / make_tbl.c < prev    next >
C/C++ Source or Header  |  1994-04-25  |  4KB  |  150 lines

  1. /*     @(#)make_tbl.c    1.8 3/15/94  */
  2.  
  3. /**********************************************************************
  4. FILE   : make_tbl.c
  5. PURPOSE: SNNS-Kernel Tool: Calculates the lookup tables for table lookup
  6.      transfer functions
  7. NOTES  : 
  8. AUTHOR : Niels Mache
  9. DATE   : 06.12.91
  10. VERSION : 1.8  3/15/94
  11.  
  12.              Copyright (c) 1990-1994  SNNS Group, IPVR, Univ. Stuttgart, FRG
  13.  
  14. **********************************************************************/
  15.  
  16. #include <stdio.h>
  17. #include <math.h>
  18.  
  19.  
  20. #define NEWLINE_INSERT    10
  21. #define PRECISION  7
  22.  
  23.  
  24.  
  25. /*  user defined parameters
  26. */
  27. #define NO_OF_APPROX 1000
  28. #define MIN_APPROX_X -12.0
  29. #define MAX_APPROX_X  12.0
  30. #define MINUS_INFINITE_BORDER  -13.0
  31. #define PLUS_INFINITE_BORDER    13.0
  32. #define MINUS_INFINITE_FUNC_VALUE  0.0
  33. #define PLUS_INFINITE_FUNC_VALUE   1.0
  34.  
  35.  
  36. #define ERR_MINUS_INFINITE_BORDER  -100.0
  37. #define ERR_PLUS_INFINITE_BORDER    100.0
  38. #define ERROR 7.425010618e-05
  39. /*
  40. #define INDEX_OFFSET (NO_OF_APPROX / 2)
  41. #define SCALE_FACTOR (NO_OF_APPROX / (MAX_APPROX_X - MIN_APPROX_X))
  42. #define MIN_INDEX ((int) (MINUS_ININITE_BORDER * SCALE_FACTOR) + INDEX_OFFSET)
  43. #define MAX_INDEX ((int) (PLUS_ININITE_BORDER * SCALE_FACTOR) + INDEX_OFFSET)
  44. */
  45.  
  46. /*  Sigmoid Function
  47. */
  48. double    f( x )
  49. double    x;
  50. {
  51.   return( 1.0 / (1.0 + exp( -x )));
  52. }
  53.  
  54.  
  55. void  calc_m_and_b( x1, x2, m, b )
  56. double    x1, x2;
  57. double    *m, *b;
  58. {
  59.   double  y1, y2;
  60.  
  61.   y1 = f( x1 );
  62.   y2 = f( x2 );
  63.  
  64.   *m = (y2 - y1) / (x2 - x1);
  65.   *b = y1 - *m * x1;
  66. }
  67.  
  68.  
  69. int  main()
  70. {
  71.   double  x, m, b, step, scale;
  72.   int  i, nl_cycle;
  73.   int  index_offset, min_index, max_index;
  74.  
  75.  
  76.   index_offset = NO_OF_APPROX / 2;
  77.   step = (MAX_APPROX_X - MIN_APPROX_X) / (double) NO_OF_APPROX;
  78.   scale = (double) NO_OF_APPROX / (MAX_APPROX_X - MIN_APPROX_X);
  79.   min_index = (int) (MINUS_INFINITE_BORDER * scale) + index_offset;
  80.   max_index = (int) (PLUS_INFINITE_BORDER * scale) + index_offset;
  81.  
  82.   fprintf( stdout, "/*\nNo. of Approx.: %d\nMin. x: %g\nMax. x: %g\n",
  83.        NO_OF_APPROX, MIN_APPROX_X, MAX_APPROX_X );
  84.   fprintf( stdout, "Minus inf. border: %g\nPlus inf. border : %g\n",
  85.        MINUS_INFINITE_BORDER, PLUS_INFINITE_BORDER );
  86.   fprintf( stdout, "Error in [%+g,%+g]: %g\n*/\n\n",
  87.        ERR_MINUS_INFINITE_BORDER, ERR_PLUS_INFINITE_BORDER, ERROR );
  88.  
  89.   fprintf( stdout, "#define NO_OF_APPROX %d\n#define INDEX_OFFSET %d\n",
  90.        NO_OF_APPROX, index_offset );
  91.   fprintf( stdout, "#define MINUS_INFINITE_FUNC_VALUE %#.10g\n#define PLUS_INFINITE_FUNC_VALUE %#.10g\n",
  92.        MINUS_INFINITE_FUNC_VALUE, PLUS_INFINITE_FUNC_VALUE );
  93.   fprintf( stdout, "#define SCALE_FACTOR %#.10g\n#define MIN_INDEX %d\n#define MAX_INDEX %d\n\n",
  94.        scale, min_index, max_index );
  95.  
  96.  
  97.   fprintf( stdout, "static float m[] = {\n" );
  98.  
  99.   calc_m_and_b( MINUS_INFINITE_BORDER, MIN_APPROX_X, &m, &b );
  100.   fprintf( stdout, "%.8g,  /*  minus infinite border  */\n", m );
  101.  
  102.   x = MIN_APPROX_X;
  103.   nl_cycle = 0;
  104.   for (i = 0; i < NO_OF_APPROX - 1; i++)
  105.     {
  106.     calc_m_and_b( x, x + step, &m, &b );
  107.  
  108.     if ((++nl_cycle % NEWLINE_INSERT) == 0)
  109.       fprintf( stdout, "%.8g,\n", m );
  110.     else
  111.       fprintf( stdout, "%.8g, ", m );
  112.  
  113.     x += step;
  114.     }
  115.  
  116.   calc_m_and_b( MAX_APPROX_X, PLUS_INFINITE_BORDER, &m, &b );
  117.   if ((nl_cycle % NEWLINE_INSERT) == 0)
  118.     fprintf( stdout, "%.8g  };  /*  plus infinite border  */\n\n", m );
  119.   else
  120.     fprintf( stdout, "\n%.8g  };  /*  plus infinite border  */\n\n", m );
  121.  
  122.  
  123.   fprintf( stdout, "static float b[] = {\n" );
  124.  
  125.   calc_m_and_b( MINUS_INFINITE_BORDER, MIN_APPROX_X, &m, &b );
  126.   fprintf( stdout, "%.8g,  /*  minus infinite border  */\n", b );
  127.  
  128.   x = MIN_APPROX_X;
  129.   nl_cycle = 0;
  130.   for (i = 0; i < NO_OF_APPROX - 1; i++)
  131.     {
  132.     calc_m_and_b( x, x + step, &m, &b );
  133.  
  134.     if ((++nl_cycle % NEWLINE_INSERT) == 0)
  135.       fprintf( stdout, "%.8g,\n", b );
  136.     else
  137.       fprintf( stdout, "%.8g, ", b );
  138.  
  139.     x += step;
  140.     }
  141.  
  142.   calc_m_and_b( MAX_APPROX_X, PLUS_INFINITE_BORDER, &m, &b );
  143.   if ((nl_cycle % NEWLINE_INSERT) == 0)
  144.     fprintf( stdout, "%.8g  };  /*  plus infinite border  */\n", b );
  145.   else
  146.     fprintf( stdout, "\n%.8g  };  /*  plus infinite border  */\n", b );
  147.  
  148.   exit( 0 );
  149. }
  150.